package Classes_Conexao;
// importa pacotes e componentes necessarios para rodar recursos do java
import Classes.Cliente;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class ClienteDAO {
    // instanciando um atributo da classe ClienteDAO.

    private Connection connection;

    public ClienteDAO() throws SQLException {
        this.connection = Conexao.getConnection();
    }
    // adiciona a instancia no banco de dados!

    public void adiciona(Cliente cliente) throws SQLException {
        // fazendo a consulta SQL, para inserir os valores nas colunas da tabela cliente no banco de dados.
        String sql = "insert into clientes (nome, apelido, cliente, fornecedor, ativo, TipoPessoa, endereco, bairro, cidade, cep, uf, fone1, fone2, fax, cel, cnpj, cgf, obs) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        // insere os dados do cliente com a conexao para o banco de dados.
        PreparedStatement stmt = connection.prepareStatement(sql);
        // busca os campos preenchidos na classe de Clientes.
        stmt.setString(1, cliente.getNome());
        stmt.setString(2, cliente.getApelido());
        stmt.setString(3, cliente.getCliente());
        stmt.setString(4, cliente.getFornecedor());
        stmt.setString(5, cliente.getAtivo());
        stmt.setString(6, cliente.getTipoPessoa());
        stmt.setString(7, cliente.getEndereco());
        stmt.setString(8, cliente.getBairro());
        stmt.setString(9, cliente.getCidade());
        stmt.setString(10, cliente.getCep());
        stmt.setString(11, cliente.getUf());
        stmt.setString(12, cliente.getFone1());
        stmt.setString(13, cliente.getFone2());
        stmt.setString(14, cliente.getFax());
        stmt.setString(15, cliente.getCelular());
        stmt.setString(16, cliente.getCnpj());
        stmt.setString(17, cliente.getCgf());
        stmt.setString(18, cliente.getObs());
        // executa e finaliza o processo de adicionar.
        stmt.execute();
        stmt.close();

    }

    //busca todos os registro do banco de dados pelo nome do cliente na tabela cliente.
    public ArrayList<Cliente> retornaClientePorNome(String nome) {
        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            // consulta em SQL que busca todos os cliente com aquela caracteristica de nome.
            String sql = "SELECT * FROM clientes WHERE nome LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); // executeQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                //
                Cliente cliente = new Cliente();
                cliente.setCodigo(rs.getInt("codigo"));
                cliente.setNome(rs.getString("nome"));
                cliente.setApelido(rs.getString("apelido"));
                cliente.setCliente(rs.getString("cliente"));
                cliente.setFornecedor(rs.getString("fornecedor"));
                cliente.setAtivo(rs.getString("ativo"));
                cliente.setTipoPessoa(rs.getString("TipoPessoa"));
                cliente.setEndereco(rs.getString("endereco"));
                cliente.setBairro(rs.getString("bairro"));
                cliente.setCidade(rs.getString("cidade"));
                cliente.setCep(rs.getString("cep"));
                cliente.setUf(rs.getString("uf"));
                cliente.setFone1(rs.getString("fone1"));
                cliente.setFone2(rs.getString("fone2"));
                cliente.setFax(rs.getString("fax"));
                cliente.setCelular(rs.getString("cel"));
                cliente.setCnpj(rs.getString("cnpj"));
                cliente.setCgf(rs.getString("cgf"));
                cliente.setObs(rs.getString("obs"));
                // adiciona todos os resultados na listaCliente que um arrayList.
                listaCliente.add(cliente);
            }
            // fecha o comando
            comando.close();
            // retorna a listaCliente;
            return listaCliente;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }

    }

    //retorna todos os registro do banco de dados da tabela cliente.
    public ArrayList<Cliente> retornaTodosClientes() {
        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            // consulta SQL que retorna todos os registros da tabela de clientes do banco de dados
            String sql = "SELECT * FROM clientes";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //executeQuery associado as operações de insert,delete,update.

            while (rs.next()) {
                //
                Cliente cliente = new Cliente();
                cliente.setCodigo(rs.getInt("codigo"));
                cliente.setNome(rs.getString("nome"));
                cliente.setApelido(rs.getString("apelido"));
                cliente.setCliente(rs.getString("cliente"));
                cliente.setFornecedor(rs.getString("fornecedor"));
                cliente.setAtivo(rs.getString("ativo"));
                cliente.setTipoPessoa(rs.getString("TipoPessoa"));
                cliente.setEndereco(rs.getString("endereco"));
                cliente.setBairro(rs.getString("bairro"));
                cliente.setCidade(rs.getString("cidade"));
                cliente.setCep(rs.getString("cep"));
                cliente.setUf(rs.getString("uf"));
                cliente.setFone1(rs.getString("fone1"));
                cliente.setFone2(rs.getString("fone2"));
                cliente.setFax(rs.getString("fax"));
                cliente.setCelular(rs.getString("cel"));
                cliente.setCnpj(rs.getString("cnpj"));
                cliente.setCgf(rs.getString("cgf"));
                cliente.setObs(rs.getString("obs"));
                // adiciona todos os resultados na listaCliente que um arrayList.
                listaCliente.add(cliente);
            }
            // fecha o comando
            comando.close();
            // retorna a listaCliente;
            return listaCliente;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    //retorna o Codigo do cliente do banco de dados.
    public ArrayList<Cliente> retornaCodigo() {
        PreparedStatement comando;
        // cria uma ArrayList que guardara o codigo do cliente
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            // consulta SQL que retornará o codigo do cliente.
            String sql = "SELECT * FROM clientes";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //executeQuery associado as operações de insert,delete,update.
            while (rs.next()) {
                Cliente cliente = new Cliente();
                cliente.setCodigo(rs.getInt("codigo"));
                // adiciona o codigo do cliente na listaCliente
                listaCliente.add(cliente);
            }
            // fecha o comando.
            comando.close();
            // retorna a listaCliente.
            return listaCliente;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    //retorna o CPF/CNPJ do banco de dados.
    public ArrayList<Cliente> retornaCPF() {
        PreparedStatement comando;
        // cria uma ArrayList que guardara o CPF/CNPJ do cliente
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            // consulta SQL que guardara o CPF/CNPJ
            String sql = "SELECT * FROM clientes";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //executeQuery associado as operações de insert,delete,update.
            while (rs.next()) {
                Cliente cliente = new Cliente();
                cliente.setCnpj(rs.getString("cnpj"));
                // adiciona o CPF/CNPJ na lista de Cliente.
                listaCliente.add(cliente);
            }
            // fecha o comando
            comando.close();
            // retorna listaCliente.
            return listaCliente;
            // instancia de erro.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo para fazer a verificação para saber se existe mais de um CPF/CNPJ com o mesmo codigo.

    public ArrayList<Cliente> buscaCPF(Cliente registro) throws SQLException {
        PreparedStatement comando;
        // cria um ArrayList de Cliente.
        ArrayList<Cliente> resultado = new ArrayList<Cliente>();
        ResultSet rs = null;

        try {
            // cria uma consulta em SQL para fazer uma verificação de dados com o campo de cnpj da tabela do banco de dados
            String sql = ("select cnpj from clientes where cnpj =?");

            comando = connection.prepareStatement(sql);
            comando.setString(1, registro.getCnpj());
            comando.execute();
            // guarda o resultado na variavel rs instanciada no começo do metodo
            rs = comando.getResultSet();

            while (rs.next()) {
                Cliente temp = new Cliente();
                temp.setCnpj(rs.getString("cnpj"));
                // adiciona o resultado na variavel
                resultado.add(temp);

            }
            // fecha o comando
            comando.close();
            // retorna o resultado
            return resultado;
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }
    // metodo que exclui uma instancia do banco de dados

    public void excluir(Cliente cliente) {
        PreparedStatement comando;
        try {
            // consulta SQL que exclui uma instancia do banco de dados
            String sql = "DELETE FROM clientes WHERE nome=?";
            comando = connection.prepareStatement(sql);
            // exclui a instancia pelo nome do cliente no banco de dados
            comando.setString(1, cliente.getNome());
            // executa e fecha o comando
            comando.execute();
            comando.close();
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    // metodo que edita uma instnacia de instancia do banco de dados (Atualiza).

    public void editar(Cliente cliente) {
        PreparedStatement comando;
        try {
            // consulta SQL que atualiza um dado da tabela de clientes do banco de dados passada pelo codigo do cliente
            String sql = "UPDATE clientes SET nome = ?, apelido = ?, cliente = ?, fornecedor = ?, ativo = ?, TipoPessoa = ?, endereco = ?, bairro = ?, cidade = ?, cep = ?, uf = ?, fone1 = ?, fone2 = ?, fax = ?, cel = ?, cnpj = ?, cgf = ?, obs = ? WHERE codigo = ?;";
            // chama a conexão
            comando = connection.prepareStatement(sql);
            comando.setString(1, cliente.getNome());
            comando.setString(2, cliente.getApelido());
            comando.setString(3, cliente.getCliente());
            comando.setString(4, cliente.getFornecedor());
            comando.setString(5, cliente.getAtivo());
            comando.setString(6, cliente.getTipoPessoa());
            comando.setString(7, cliente.getEndereco());
            comando.setString(8, cliente.getBairro());
            comando.setString(9, cliente.getCidade());
            comando.setString(10, cliente.getCep());
            comando.setString(11, cliente.getUf());
            comando.setString(12, cliente.getFone1());
            comando.setString(13, cliente.getFone2());
            comando.setString(14, cliente.getFax());
            comando.setString(15, cliente.getCelular());
            comando.setString(16, cliente.getCnpj());
            comando.setString(17, cliente.getCgf());
            comando.setString(18, cliente.getObs());
            comando.setString(19, Integer.toString(cliente.getCodigo()));
            // executa a Atualização
            comando.executeUpdate();
            // fecha o comando
            comando.close();
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}
